{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对应 `tf.keras` 的01~02章节"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:08.619400Z",
     "start_time": "2025-03-05T06:13:06.429084Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm  # 进度条\n",
    "import torch  # PyTorch\n",
    "import torch.nn as nn  # 神经网络模块\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "# 打印各模块的版本\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "# 打印cuda信息\n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.9.1\n",
      "numpy 2.0.0\n",
      "pandas 2.2.2\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu126\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "source": "28 * 28",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:08.623076Z",
     "start_time": "2025-03-05T06:13:08.620404Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## 数据准备1，为了看灰度图片"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.552361Z",
     "start_time": "2025-03-05T06:13:08.623076Z"
    }
   },
   "source": [
    "from torchvision import datasets  # torchvision 是一个用于计算机视觉的开源库\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "# 定义数据集的变换.图片变为tensor,现在什么都没做，就不会变成tensor\n",
    "transform = transforms.Compose([\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform  # 现在还没转换，可以写None\n",
    ")\n",
    "\n",
    "# 可以去官网看数据集的说明，里面有标签说明\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.555867Z",
     "start_time": "2025-03-05T06:13:09.552361Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "source": "len(train_ds)  # 60000个训练样本",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.563666Z",
     "start_time": "2025-03-05T06:13:09.556872Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "source": "type(train_ds[0])  # ",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.569750Z",
     "start_time": "2025-03-05T06:13:09.563666Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.575220Z",
     "start_time": "2025-03-05T06:13:09.569750Z"
    }
   },
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]"
   ],
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.581729Z",
     "start_time": "2025-03-05T06:13:09.575220Z"
    }
   },
   "cell_type": "code",
   "source": "type(img)  #tensor中文是 张量,和numpy的ndarray类似",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.592236Z",
     "start_time": "2025-03-05T06:13:09.581729Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACD0lEQVR4AbWRz2sTQRTH38zszm42k6Q2TU2ixURstRdRasWC9FCsUE9SpIKnKl48+x94UOjNiyf/h4KgKN7TYgNKK+agjZS0wZDYbND90dn54VqxIWfxXebBB97nfecB/P9CAKkFAGT8ViEEh+9fLZZn7gde+E4AwkgAGYBEzl3btZz55y0tgSl/AHKYLhH85uJKdat2ebqyFmuOCun5laFIwcYXjvLRxq1nfRh3er0ESHAI1fvPYqF8oj9WxxO6hcAyWZhQV2fw6OvBbcEh2O/tlxTCjlRjgPtGAqwYcpN7GWUlPbppXepDTeB2AduQHONWpOzsi09GHxocPobUccZPh8RhcvfOy/V4IUQwigMIgFdeQHWb2BFEipzvxU6iBT9QALNPq8F3oYTnSRt8oN4iHOYcLk4UFs+GOEo0TZrlToXNqp7ZmkQw8yg3JIkrHI6C2lI1dawE9dQPP8HSDiJrRSF9IAFAZmT5+oNm+LU+nuVmispT6N6TbcYsMDONZg7nb9rl5NQU5pgCMq8YrUY6bDCa3t9hQShWt0rD3I0kNxWiE8aebiRH3E7bsEw7hTuTXqNrdSIRJfK9C8aH1bvNesioTcmB1P43JY2QcdeNRLkVR7nx8HjblYQaBGnTpCYC1AKq8ptLCMf55x6PZjAxJGrpPfWTgI58/LZW+fMJ8WXO5bond/j20Y3+sfkFaCTYdrBYeB0AAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "source": [
    "type(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.595288Z",
     "start_time": "2025-03-05T06:13:09.592236Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.601795Z",
     "start_time": "2025-03-05T06:13:09.595288Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':  # L表示灰度图\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "\n",
    "\n",
    "show_img_content(img)  #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.607520Z",
     "start_time": "2025-03-05T06:13:09.601795Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: (28, 28)\n",
      "图像模式: L\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "一个像素就是一个数，0-255，0表示黑色，255表示白色，中间的数字表示不同的灰度。一个字节就是8位，也就是2的8次方，所以一个像素占用一个字节。\n",
    "\n",
    "rgb3色 rgb的三个通道，每个通道8位，所以一个像素占用3个字节，所以一张图片的大小是宽乘高乘3。"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\")  # 显示图片\n",
    "    plt.colorbar()  # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_single_image(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.674252Z",
     "start_time": "2025-03-05T06:13:09.607520Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据准备2，为训练做准备"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.701909Z",
     "start_time": "2025-03-05T06:13:09.675256Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "mean = 0.2860\n",
    "std = 0.3205\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),  # 转换为tensor，进行归一化（变为0-1之间），只是格式变了，数据没变 ，变成了浮点数\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.705182Z",
     "start_time": "2025-03-05T06:13:09.702412Z"
    }
   },
   "cell_type": "code",
   "source": [
    "img_tensor, label = train_ds[0]\n",
    "img_tensor.shape  #img这时是一个tensor，shape=(1, 28, 28)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.711545Z",
     "start_time": "2025-03-05T06:13:09.705182Z"
    }
   },
   "cell_type": "code",
   "source": "type(img_tensor)",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:09.717353Z",
     "start_time": "2025-03-05T06:13:09.712055Z"
    }
   },
   "cell_type": "code",
   "source": "label",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.674894Z",
     "start_time": "2025-03-05T06:13:09.717353Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds:  # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2))  # 计算每张图片的均值，dim=(1, 2)表示计算每张图片的每一个像素的均值,行列共同求均值\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.860094Z",
     "start_time": "2025-03-05T06:13:13.674894Z"
    }
   },
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index + 1)  #因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维,shape=(28,28,1)\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation='nearest')  #interpolation='nearest'是临近插值\n",
    "            plt.axis('off')  #去除坐标系\n",
    "            plt.title(class_names[label])  # 显示类别名称\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot']  #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "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fvllJyUlxWq3Y8cO56abbnIKFy7sAPB1KPblhA5u3LjR6d27t1O5cmUnJCTEiYiIcDp16uSsX7/etLmcueMWOjhkyJB077969WonJibGCQ4OzlVhhDkJx8//pIZfp/4XHBzslCtXzrn55pudV1991aSISCW9d65k6tSpTkxMjFO4cGGnaNGiTv369Z3hw4c7v/76q+M4gc2Djz/+2LnllluciIgIJzg42KlcubIzePBg57fffsuah+BjuAYzRpDjBODtQwghhBCSC7ni6teEEEIIITkFNzKEEEII8S3cyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt2So1hLJn8iUQxmttbF9+3YjDx061MipBUdTue6664wsK6AXLGhP2W3bthl5zpw5Rq5WrZrVbvjw4UYuUaLEZfY6/6Irx7/33ntG7tu3r5HLlSt3xffatGmTkVPrkqVy++23Gzk10zZxJzEx0chffvmldW7u3LlGLlWqlJHvueceq931119vZDken3zyidVu2bJlRpa16vr06WO1GzRoUEB9JznHr7/+auTIyMgc7MnlQY0MIYQQQnwLM/sSi4xoXb777jvrWBbV1P96k+XkZan533//3Wp3/PjxgO4tqVmzppFldXLA/hel1B7oKsCPPfaYkevXr3/ZfcgLyHGZMWOGde6VV14xstSUhYeHW+3kOalBkdcG7OJ2P//8s5G7du1qtWvevLmR77jjDq/u5xsWLVpk5AkTJljnZIXk5ORk65yss3T69GkjS+0mABw6dMjIVapUMbLWipYvX97IxYsXN7IuXPjLL78YuV27dkZ+7bXXQGzatGlj5BMnTljnypQpY2RZKFmOkRdS6wIArVu3NrJ8D1euXNlqt2TJEiNLzVtugBoZQgghhPgWbmQIIYQQ4lu4kSGEEEKIb6GPDAkYaU+XESubN2+22skpVaRIEeuctN1LW7v0nQGACxcuGPnUqVNGvvrqq6128nOB+vT88ccfRta+OdKfoEWLFta5Dz/8MKDr5yVmz55tHcvxe/75542s7e7Sv0L6SuiIsaJFixpZ+k3cddddVjvpW6P9Z/ITe/bsMfKoUaOMHBERYbWT8zolJcU6J/3H5BqUPkoaubb0Wi1WrJiRpT+U9qUpXbq0kaW/jJ4T48aNc+1HfqFVq1ZGlmMO2OtJjrN+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EBwcjISEBPP3Dz/8EDExMShcuDBKlSqFO++8Ez///LP12VatWqFevXrYsGEDbrrpJlx99dV48sknL3lPv8I16E8CXZfTpk1DmzZtEBERgZCQENSpUweTJk1K85kqVaqgU6dOWLlyJZo0aYLQ0FBUq1YNH3zwQZq227ZtQ5s2bVC4cGFUrFgRzz33HFJSUtK0mzt3Ljp27IjIyEiEhIQgOjoazz77rDWe+RmOYeaRoxuZPXv2AABKly6d6dceNWoUhgwZgsjISIwbNw633347pkyZgltuuQV//vknAKBXr144e/Ys/ve//1mfPXfuHObPn48ePXqgQIECAIDp06ejY8eOKFKkCMaMGYOnnnoKP/zwA1q0aJHGOerChQuIi4tDREQExo4di9tvvz3Tv192ERUVhQ0bNuD777+/ZNuVK1fioYcewp133omXXnoJf/zxB26//XYcO3bMtDl06BCaNWuGZcuWYejQoXj11VdRvXp13HfffXjllVdMu9OnT+Ptt99Gq1atMGbMGIwaNQpHjhxBXFwcNm3a5NqHixcvon///vjggw8wZ84cdO/eHcBf//rp27cvatSogfHjx2PYsGH4/PPPcdNNN1k/rABw7NgxtG/fHg0bNsQrr7yC1q1bX9Yz8xNcg/4k0HU5adIkREVF4cknn8S4ceNQqVIlPPTQQ3jzzTfTtN29ezd69OiBm2++GePGjUPJkiXRv39/a6N48OBBtG7dGps2bcKIESMwbNgwfPDBB3j11VfTXO+9995DkSJF8Pe//x2vvvoqYmJi8PTTT2PEiBFX/gDyABzDTMTJBqZNm+YAcJYtW+YcOXLE+fnnn50ZM2Y4pUuXdgoXLuz88ssvTmxsrBMbG5vms/369XOioqKsvwFwRo4cmeb6iYmJjuM4zuHDh53g4GDnlltucS5evGjavfHGGw4A591333Ucx3FSUlKcChUqOLfffrt1/VmzZjkAnK+++spxHMdJSkpySpQo4QwcONBqd/DgQad48eLW3/v16+cAcEaMGHG5jylX8tlnnzkFChRwChQo4DRv3twZPny4s2TJEic5OdlqB8AJDg52du/ebf62efNmB4Dz+uuvm7/dd999Tvny5Z2jR49an7/zzjud4sWLO+fOnXMcx3EuXLjgnD9/3mpz4sQJp2zZss6AAQPM3xITEx0Azssvv+z8+eefTq9e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eDhatWqFM2fOuLY7f/48Ro4cierVqyMkJASVKlXC8OHDcf78+YC/z4YNG3DDDTeY+TB58uQ0bQ4fPoz77rsPZcuWRWhoKK699lq8//77adqdPXsWjz32GCpVqoSQkBBcc801GDt2LBzHMW2CgoJw9uxZvP/++2Yu9O/fP+D+5hR79uxB3bp107xYASAiIsLI06ZNQ5s2bRAREYGQkBDUqVMHkyZNSvOZKlWqoFOnTli5ciWaNGmC0NBQVKtWDR988EGattu2bUObNm1QuHBhVKxYEc899xxSUlLStJs7dy46duyIyMhIhISEIDo6Gs8++ywuXrx4ZV8+D8Dx8w+BjlXq782nn36KevXqISQkBHXr1sXixYvTfO7AgQMYMGAAypYta9q9++67Vpvk5GQ8/fTTiImJQfHixREWFoaWLVtixYoVl+yz4zgYNGgQgoODkZCQYP7+4YcfIiYmBoULF0apUqVw55134ueff7Y+m+qvuGHDBtx00024+uqr8eSTT17ynldCjmpkroTDhw/jlltuQXh4OEaMGIESJUpg37591kNP5aOPPkJSUhIGDx6MoKAgvPTSS+jevTv27t2LQoUKed5n+fLlmDVrFoYOHYoyZcrg2muvxaRJk/Dggw+iW7du6N69OwCgQYMGWfI9s5r4+Hh0794dwcHB6N27NyZNmoR169ahcePGadpm5DmuW7cOcXFxaNSoEebOnYvChQun2y4lJQVdunTBypUrMWjQINSuXRtbt27FhAkTsHPnzoB8UE6cOIEOHTqgZ8+e6N27N2bNmoUHH3wQwcHBZoP7+++/o1WrVti9ezeGDh2KqlWrYvbs2ejfvz9OnjyJRx99FMBfC7lLly5YsWIF7rvvPjRs2BBLlizB448/jgMHDmDChAkA/jKP3n///WjSpAkGDRoEAIiOjr5kX3OaqKgorFmzBt9//72nk/SkSZNQt25ddOnSBQULFsT8+fPx0EMPISUlBUOGDLHa7t69Gz169MB9992Hfv364d1330X//v0RExODunXrAgAOHjyI1q1b48KFCxgxYgTCwsIwderUdOfFe++9hyJFiuDvf/87ihQpguXLl+Ppp5/G6dOn8fLLL2fuA/EZHD//EOhYAcDKlSuRkJCAhx56CEWLFsVrr72G22+/HT/99BNKly4NADh06BCaNWtmNj7h4eFYtGgR7rvv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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 19
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.863256Z",
     "start_time": "2025-03-05T06:13:13.860094Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32,\n",
    "                                           shuffle=True)  #batch_size分批，shuffle洗牌：打乱数据，让模型训练更稳定，避免陷入局部最优解\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 20
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。cpu把数据加载到内存中，多线程会加载得更快gpu把数据加载到显存中，gpu的并行计算能力可以加速数据处理。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.875355Z",
     "start_time": "2025-03-05T06:13:13.863256Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for datas, labels in train_loader:\n",
    "    print(datas.shape)  # [batch size, 1, 28, 28]所有深度学习的第一维都是batch size\n",
    "    print(labels.shape)\n",
    "    break\n",
    "#查看val_loader\n",
    "for datas, labels in val_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.879790Z",
     "start_time": "2025-03-05T06:13:13.875355Z"
    }
   },
   "source": [
    "# 搭建模型 深度学习搭建模型一半都会继承nn.Module类\n",
    "class NeuralNetwork(nn.Module):  # 继承nn.Module类：神经网络模型\n",
    "    def __init__(self):\n",
    "        super().__init__()  # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数 # 做类似线性回归的处理\n",
    "            nn.ReLU(),  # 激活函数，\n",
    "            nn.Linear(300, 100),  #隐藏层神经元数100\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(100, 10),  #输出层神经元数10 ，softmax不在这里，在后面的损失函数中\n",
    "        )  # 线性层linear_relu_stack:意味着有3层线性层，激活函数: ReLU\n",
    "\n",
    "    def forward(self, x):  # 前向计算，前向传播固定名字，forward前向计算固定名字\n",
    "        # x.shape [batch size, 1, 28, 28],1是通道数\n",
    "        x = self.flatten(x)\n",
    "        # print(f'x.shape--{x.shape}')\n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits  #没有经过softmax,称为logits\n",
    "\n",
    "\n",
    "model = NeuralNetwork()  # 实例化模型"
   ],
   "outputs": [],
   "execution_count": 22
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.885831Z",
     "start_time": "2025-03-05T06:13:13.879790Z"
    }
   },
   "source": [
    "# 看看网络结构\n",
    "model  # 父类nn.Module中重写了__str__方法，所以可以直接打印模型，打印出模型的结构 "
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.892339Z",
     "start_time": "2025-03-05T06:13:13.885831Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#为了查看模型运算的tensor尺寸\n",
    "x = torch.randn(32, 1, 28, 28)\n",
    "print(x.shape)\n",
    "logits = model(x)  # 继承的nn.Module类，可以直接调用forward方法，实际是重写了__call__方法，所以可以直接调用，前向传播，前向计算，模型验证等等\n",
    "print(logits.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32, 10])\n"
     ]
    }
   ],
   "execution_count": 24
  },
  {
   "cell_type": "code",
   "source": "784 * 300 + 300 + 300 * 100 + 100 + 100 * 10 + 10",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.897495Z",
     "start_time": "2025-03-05T06:13:13.892339Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 25
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.903250Z",
     "start_time": "2025-03-05T06:13:13.897495Z"
    }
   },
   "source": [
    "for name, param in model.named_parameters():  # 打印模型参数\n",
    "    print(name, param.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 26
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.915695Z",
     "start_time": "2025-03-05T06:13:13.903250Z"
    }
   },
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[ 0.0106, -0.0004,  0.0287,  ...,  0.0064, -0.0291, -0.0013],\n",
       "         [-0.0078, -0.0197, -0.0121,  ...,  0.0256,  0.0062,  0.0221],\n",
       "         [ 0.0208,  0.0351,  0.0048,  ...,  0.0357, -0.0046, -0.0167],\n",
       "         ...,\n",
       "         [ 0.0230, -0.0351, -0.0287,  ...,  0.0277, -0.0234,  0.0184],\n",
       "         [-0.0069,  0.0030, -0.0268,  ...,  0.0291,  0.0251, -0.0036],\n",
       "         [ 0.0227,  0.0219,  0.0098,  ..., -0.0225,  0.0045, -0.0095]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0136,  0.0067,  0.0052,  0.0317, -0.0077,  0.0281, -0.0240, -0.0332,\n",
       "          0.0192, -0.0236, -0.0249,  0.0024, -0.0232, -0.0160, -0.0157, -0.0228,\n",
       "          0.0274, -0.0081,  0.0275, -0.0320,  0.0033, -0.0161,  0.0112, -0.0155,\n",
       "          0.0116, -0.0203, -0.0236,  0.0261, -0.0324,  0.0339, -0.0188, -0.0024,\n",
       "         -0.0073, -0.0218, -0.0052, -0.0178,  0.0117, -0.0171, -0.0318,  0.0131,\n",
       "         -0.0087,  0.0120, -0.0261, -0.0128, -0.0048, -0.0082,  0.0309,  0.0289,\n",
       "          0.0219, -0.0113, -0.0352, -0.0355,  0.0133, -0.0243,  0.0328,  0.0025,\n",
       "          0.0163, -0.0196,  0.0039, -0.0014, -0.0025, -0.0186, -0.0095,  0.0191,\n",
       "          0.0303, -0.0306,  0.0245, -0.0153, -0.0087, -0.0256, -0.0089, -0.0320,\n",
       "          0.0199, -0.0336,  0.0063,  0.0218, -0.0045, -0.0272,  0.0042,  0.0156,\n",
       "         -0.0013, -0.0199, -0.0033, -0.0354, -0.0059, -0.0117,  0.0072,  0.0044,\n",
       "          0.0060, -0.0067, -0.0099,  0.0321, -0.0318, -0.0075, -0.0149, -0.0079,\n",
       "          0.0082,  0.0299,  0.0049,  0.0341, -0.0277,  0.0245,  0.0036,  0.0202,\n",
       "         -0.0188,  0.0083, -0.0329,  0.0349, -0.0106,  0.0121, -0.0208, -0.0104,\n",
       "         -0.0102, -0.0187, -0.0092, -0.0128, -0.0086,  0.0035, -0.0207, -0.0261,\n",
       "         -0.0018, -0.0339, -0.0314,  0.0259, -0.0236,  0.0099,  0.0054, -0.0173,\n",
       "         -0.0115, -0.0181,  0.0047,  0.0211,  0.0146, -0.0032,  0.0341,  0.0017,\n",
       "          0.0117,  0.0312,  0.0037, -0.0354, -0.0201, -0.0133,  0.0271, -0.0179,\n",
       "         -0.0199,  0.0334, -0.0063,  0.0226,  0.0075,  0.0114, -0.0089, -0.0139,\n",
       "          0.0219, -0.0079,  0.0206, -0.0082,  0.0009,  0.0226, -0.0061,  0.0044,\n",
       "          0.0293,  0.0089, -0.0117, -0.0266, -0.0065, -0.0207,  0.0279,  0.0150,\n",
       "          0.0323, -0.0091,  0.0122, -0.0156, -0.0242,  0.0052, -0.0345,  0.0135,\n",
       "         -0.0313, -0.0340, -0.0353,  0.0058, -0.0002,  0.0356,  0.0163,  0.0041,\n",
       "         -0.0163, -0.0345,  0.0225,  0.0046,  0.0084,  0.0032, -0.0218, -0.0183,\n",
       "          0.0043, -0.0035,  0.0109, -0.0123,  0.0067,  0.0082, -0.0030,  0.0154,\n",
       "         -0.0264,  0.0346,  0.0288,  0.0244,  0.0062, -0.0120, -0.0002,  0.0019,\n",
       "         -0.0212, -0.0029,  0.0042, -0.0265, -0.0044, -0.0012,  0.0038,  0.0004,\n",
       "         -0.0089,  0.0183,  0.0238,  0.0286, -0.0328,  0.0155, -0.0073, -0.0266,\n",
       "          0.0243,  0.0276,  0.0281, -0.0147,  0.0006,  0.0262, -0.0348, -0.0273,\n",
       "          0.0136, -0.0338,  0.0181, -0.0040, -0.0165,  0.0315, -0.0301,  0.0286,\n",
       "          0.0097,  0.0335,  0.0126, -0.0276, -0.0177, -0.0167, -0.0033,  0.0095,\n",
       "          0.0008,  0.0357,  0.0307,  0.0318,  0.0186,  0.0179, -0.0220, -0.0278,\n",
       "          0.0163, -0.0328,  0.0347, -0.0260, -0.0128,  0.0030, -0.0254, -0.0210,\n",
       "          0.0180, -0.0307, -0.0207, -0.0026,  0.0333, -0.0013, -0.0114, -0.0042,\n",
       "          0.0170, -0.0211,  0.0143, -0.0105,  0.0241,  0.0033, -0.0020, -0.0147,\n",
       "         -0.0332, -0.0047,  0.0320, -0.0111, -0.0333, -0.0294,  0.0050, -0.0033,\n",
       "          0.0096, -0.0079,  0.0227, -0.0216,  0.0080, -0.0060, -0.0182,  0.0087,\n",
       "          0.0068, -0.0075, -0.0281,  0.0226], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0311, -0.0025,  0.0341,  ...,  0.0472, -0.0551,  0.0429],\n",
       "         [-0.0447,  0.0291, -0.0429,  ..., -0.0382, -0.0160, -0.0146],\n",
       "         [ 0.0125,  0.0019,  0.0262,  ...,  0.0074,  0.0447, -0.0272],\n",
       "         ...,\n",
       "         [ 0.0039, -0.0369,  0.0311,  ...,  0.0125, -0.0469,  0.0203],\n",
       "         [-0.0545, -0.0266, -0.0143,  ..., -0.0413,  0.0163,  0.0297],\n",
       "         [-0.0129, -0.0160, -0.0438,  ...,  0.0139,  0.0045,  0.0128]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0248,  0.0257,  0.0557, -0.0013, -0.0221,  0.0373,  0.0006,  0.0455,\n",
       "          0.0073, -0.0385, -0.0369,  0.0418,  0.0430,  0.0553, -0.0023,  0.0537,\n",
       "         -0.0222,  0.0359, -0.0307, -0.0539, -0.0337,  0.0294,  0.0162,  0.0356,\n",
       "          0.0174, -0.0344,  0.0425,  0.0558,  0.0248,  0.0567, -0.0295, -0.0083,\n",
       "         -0.0475,  0.0346, -0.0283,  0.0226,  0.0269, -0.0486, -0.0518,  0.0208,\n",
       "          0.0179, -0.0337,  0.0247, -0.0452, -0.0513,  0.0082, -0.0254,  0.0273,\n",
       "         -0.0253,  0.0276, -0.0023,  0.0528, -0.0473,  0.0075, -0.0425, -0.0236,\n",
       "          0.0268,  0.0039, -0.0195,  0.0237,  0.0142,  0.0432, -0.0267, -0.0411,\n",
       "         -0.0550, -0.0187,  0.0113, -0.0292, -0.0314, -0.0072, -0.0101,  0.0116,\n",
       "         -0.0090,  0.0268,  0.0410,  0.0336, -0.0551,  0.0041, -0.0322,  0.0352,\n",
       "         -0.0299, -0.0042, -0.0547, -0.0520, -0.0122,  0.0132,  0.0222,  0.0168,\n",
       "         -0.0542, -0.0413,  0.0135,  0.0158, -0.0072,  0.0541,  0.0187, -0.0121,\n",
       "          0.0565,  0.0116, -0.0041, -0.0021], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0430,  0.0640,  0.0482,  0.0813,  0.0684,  0.0653, -0.0642, -0.0052,\n",
       "           0.0103,  0.0939, -0.0452, -0.0399, -0.0576, -0.0759, -0.0088,  0.0738,\n",
       "           0.0371, -0.0723, -0.0132, -0.0012,  0.0842,  0.0717, -0.0654,  0.0206,\n",
       "           0.0774, -0.0374,  0.0454,  0.0611, -0.0520, -0.0387, -0.0514, -0.0757,\n",
       "          -0.0263, -0.0270,  0.0125,  0.0831,  0.0223,  0.0736,  0.0600, -0.0482,\n",
       "          -0.0647,  0.0375,  0.0254,  0.0102,  0.0267, -0.0497,  0.0050, -0.0493,\n",
       "           0.0173, -0.0239,  0.0862,  0.0487,  0.0376, -0.0907,  0.0295,  0.0955,\n",
       "          -0.0263, -0.0381, -0.0929,  0.0509,  0.0719,  0.0352,  0.0177,  0.0109,\n",
       "           0.0286, -0.0462,  0.0234, -0.0639,  0.0127, -0.0986, -0.0340,  0.0539,\n",
       "           0.0127, -0.0510,  0.0450,  0.0334,  0.0842, -0.0959,  0.0332, -0.0983,\n",
       "          -0.0032,  0.0039, -0.0432, -0.0904,  0.0075,  0.0153,  0.0319, -0.0746,\n",
       "          -0.0262,  0.0905, -0.0703, -0.0249, -0.0601,  0.0164,  0.0966,  0.0661,\n",
       "          -0.0551,  0.0645,  0.0099, -0.0207],\n",
       "         [ 0.0874,  0.0987,  0.0537,  0.0115, -0.0280,  0.0520, -0.0572,  0.0749,\n",
       "           0.0675,  0.0231, -0.0997,  0.0412,  0.0648, -0.0883, -0.0508,  0.0796,\n",
       "           0.0610,  0.0674, -0.0035, -0.0730,  0.0699, -0.0127,  0.0016, -0.0701,\n",
       "           0.0254,  0.0476,  0.0709, -0.0260,  0.0852,  0.0219,  0.0282, -0.0351,\n",
       "          -0.0987, -0.0263, -0.0130,  0.0264, -0.0055,  0.0764, -0.0241,  0.0985,\n",
       "          -0.0286,  0.0006, -0.0077,  0.0589, -0.0616, -0.0085, -0.0517, -0.0517,\n",
       "           0.0061, -0.0228, -0.0190,  0.0561, -0.0715,  0.0124, -0.0098,  0.0264,\n",
       "           0.0139, -0.0340,  0.0976,  0.0233, -0.0268, -0.0684,  0.0498, -0.0568,\n",
       "          -0.0371, -0.0840,  0.0754, -0.0274,  0.0654, -0.0293,  0.0397, -0.0896,\n",
       "           0.0501, -0.0251, -0.0818,  0.0932,  0.0474, -0.0180,  0.0366,  0.0620,\n",
       "          -0.0193,  0.0381, -0.0470, -0.0189, -0.0216, -0.0843, -0.0862,  0.0462,\n",
       "          -0.0237, -0.0162, -0.0474, -0.0346, -0.0680, -0.0750,  0.0746, -0.0173,\n",
       "          -0.0872, -0.0373, -0.0623, -0.0818],\n",
       "         [-0.0076,  0.0681,  0.0808,  0.0627, -0.0215,  0.0391, -0.0106,  0.0218,\n",
       "           0.0487, -0.0920,  0.0258,  0.0824,  0.0153, -0.0267,  0.0945,  0.0875,\n",
       "          -0.0935,  0.0838,  0.0639,  0.0872, -0.0892,  0.0260, -0.0597,  0.0668,\n",
       "          -0.0071, -0.0867, -0.0731,  0.0675,  0.0903, -0.0958, -0.0534,  0.0055,\n",
       "          -0.0682, -0.0814,  0.0605,  0.0705, -0.0029, -0.0453, -0.0900,  0.0386,\n",
       "           0.0158,  0.0867,  0.0714,  0.0387, -0.0810,  0.0217, -0.0692,  0.0428,\n",
       "           0.0277,  0.0129,  0.0729, -0.0221, -0.0302,  0.0916,  0.0046,  0.0196,\n",
       "           0.0915,  0.0532,  0.0971,  0.0134,  0.0899,  0.0270,  0.0753,  0.0717,\n",
       "           0.0841, -0.0588,  0.0956, -0.0242,  0.0371,  0.0357, -0.0652, -0.0254,\n",
       "           0.0063,  0.0679,  0.0236,  0.0824, -0.0282,  0.0889,  0.0929, -0.0736,\n",
       "           0.0259, -0.0802,  0.0781,  0.0373, -0.0463, -0.0990,  0.0864,  0.0918,\n",
       "          -0.0188, -0.0929, -0.0335,  0.0408,  0.0789,  0.0912,  0.0466,  0.0865,\n",
       "           0.0787,  0.0497, -0.0100,  0.0579],\n",
       "         [-0.0206, -0.0811,  0.0837, -0.0459, -0.0332,  0.0893, -0.0411,  0.0689,\n",
       "           0.0621,  0.0555, -0.0929, -0.0167,  0.0058, -0.0884, -0.0628,  0.0547,\n",
       "           0.0843, -0.0521,  0.0337,  0.0013,  0.0237,  0.0770, -0.0692,  0.0688,\n",
       "           0.0914,  0.0010, -0.0424,  0.0488,  0.0351, -0.0889, -0.0427,  0.0676,\n",
       "           0.0539, -0.0536, -0.0990, -0.0912,  0.0411,  0.0713, -0.0991, -0.0057,\n",
       "           0.0649,  0.0019, -0.0751, -0.0168,  0.0072, -0.0419, -0.0025, -0.0208,\n",
       "          -0.0617, -0.0698, -0.0044,  0.0143, -0.0956, -0.0795,  0.0058, -0.0245,\n",
       "          -0.0835,  0.0106, -0.0539,  0.0147,  0.0970, -0.0554,  0.0247, -0.0215,\n",
       "           0.0210,  0.0806, -0.0653,  0.0888, -0.0523, -0.0670,  0.0022,  0.0250,\n",
       "          -0.0088, -0.0822, -0.0153, -0.0417, -0.0958,  0.0235, -0.0003,  0.0264,\n",
       "           0.0658,  0.0896,  0.0546, -0.0344,  0.0549, -0.0899, -0.0027,  0.0045,\n",
       "          -0.0441, -0.0827,  0.0213, -0.0579, -0.0355,  0.0732, -0.0139,  0.0650,\n",
       "           0.0684, -0.0397,  0.0664, -0.0278],\n",
       "         [ 0.0821,  0.0209, -0.0124,  0.0969,  0.0226, -0.0167, -0.0884,  0.0399,\n",
       "          -0.0886,  0.0364, -0.0259, -0.0354, -0.0237,  0.0440, -0.0007,  0.0756,\n",
       "          -0.0529, -0.0435,  0.0261,  0.0167,  0.0181, -0.0263,  0.0083, -0.0148,\n",
       "           0.0054, -0.0163,  0.0603, -0.0549,  0.0328, -0.0662, -0.0669, -0.0627,\n",
       "          -0.0563,  0.0313, -0.0074, -0.0423, -0.0589,  0.0939, -0.0858, -0.0538,\n",
       "           0.0980,  0.0156,  0.0987,  0.0187,  0.0570, -0.0470,  0.0627, -0.0381,\n",
       "           0.0263,  0.0935,  0.0419, -0.0099,  0.0475,  0.0825,  0.0164, -0.0054,\n",
       "          -0.0645, -0.0193,  0.0750, -0.0665,  0.0432,  0.0990, -0.0054, -0.0396,\n",
       "          -0.0615, -0.0216,  0.0723,  0.0552, -0.0777, -0.0393, -0.0715, -0.0042,\n",
       "           0.0774, -0.0257,  0.0970, -0.0708, -0.0746, -0.0187, -0.0026, -0.0385,\n",
       "          -0.0280,  0.0052, -0.0735,  0.0607,  0.0804,  0.0379, -0.0160, -0.0676,\n",
       "          -0.0264, -0.0928,  0.0664,  0.0783, -0.0911, -0.1000,  0.0738, -0.0858,\n",
       "           0.0059, -0.0638, -0.0927, -0.0976],\n",
       "         [-0.0452,  0.0863, -0.0751, -0.0577, -0.0685, -0.0244,  0.0757, -0.0911,\n",
       "          -0.0359,  0.0086,  0.0237, -0.0802,  0.0038,  0.0695,  0.0709, -0.0409,\n",
       "           0.0237, -0.0395,  0.0969, -0.0484, -0.0578,  0.0068, -0.0360,  0.0745,\n",
       "           0.0973, -0.0611,  0.0368, -0.0469,  0.0968, -0.0147, -0.0885,  0.0571,\n",
       "           0.0696, -0.0034,  0.0578,  0.0581,  0.0789,  0.0415,  0.0843, -0.0729,\n",
       "           0.0113,  0.0938, -0.0567, -0.0487,  0.0923,  0.0993,  0.0984, -0.0491,\n",
       "          -0.0257, -0.0489,  0.0903, -0.0528,  0.0785, -0.0994,  0.0673,  0.0922,\n",
       "          -0.0677,  0.0700, -0.0554,  0.0885, -0.0162, -0.0609, -0.0900,  0.0947,\n",
       "          -0.0325, -0.0579,  0.0334, -0.0708,  0.0231,  0.0995, -0.0529, -0.0959,\n",
       "           0.0411, -0.0117, -0.0165, -0.0128,  0.0511,  0.0927, -0.0111, -0.0885,\n",
       "          -0.0342, -0.0245, -0.0997,  0.0237,  0.0050, -0.0237,  0.0573,  0.0482,\n",
       "           0.0540,  0.0638, -0.0912,  0.0766,  0.0543,  0.0960,  0.0701,  0.0108,\n",
       "           0.0529,  0.0871, -0.0502, -0.0841],\n",
       "         [-0.0556,  0.0113, -0.0677, -0.0062, -0.0975,  0.0635,  0.0821, -0.0450,\n",
       "          -0.0660,  0.0983,  0.0256, -0.0439, -0.0766,  0.0548, -0.0173,  0.0109,\n",
       "          -0.0644, -0.0705, -0.0078,  0.0412,  0.0799,  0.0469,  0.0477, -0.0577,\n",
       "          -0.0387,  0.0654,  0.0368, -0.0965, -0.0892,  0.0458, -0.0726, -0.0018,\n",
       "          -0.0914, -0.0133,  0.0298,  0.0269,  0.0449,  0.0895,  0.0958, -0.0564,\n",
       "          -0.0274, -0.0806, -0.0889, -0.0057,  0.0160, -0.0015, -0.0999, -0.0882,\n",
       "           0.0026, -0.0194,  0.0725, -0.0969,  0.0142, -0.0729, -0.0684,  0.0064,\n",
       "          -0.0059,  0.0163,  0.0537, -0.0728,  0.0993,  0.0423, -0.0733, -0.0910,\n",
       "          -0.0903, -0.0304,  0.0400, -0.0580, -0.0951,  0.0952, -0.0711,  0.0662,\n",
       "          -0.0109,  0.0557,  0.0029,  0.0945, -0.0845,  0.0728, -0.0116, -0.0496,\n",
       "          -0.0892, -0.0808, -0.0835,  0.0421, -0.0569, -0.0088, -0.0543,  0.0292,\n",
       "          -0.0269, -0.0722, -0.1000,  0.0759, -0.0568, -0.0613, -0.0103,  0.0331,\n",
       "          -0.0522,  0.0913,  0.0256,  0.0569],\n",
       "         [-0.0410,  0.0234, -0.0505, -0.0195, -0.0407, -0.0995,  0.0400, -0.0438,\n",
       "          -0.0962, -0.0682, -0.0413, -0.0891,  0.0892,  0.0352, -0.0193, -0.0186,\n",
       "          -0.0576, -0.0117,  0.0281, -0.0789, -0.0442,  0.0236, -0.0059, -0.0972,\n",
       "           0.0788,  0.0340, -0.0110,  0.0708, -0.0110, -0.0210,  0.0303, -0.0192,\n",
       "           0.0506, -0.0217, -0.0036, -0.0177,  0.0788, -0.0171, -0.0325, -0.0309,\n",
       "          -0.0274,  0.0584,  0.0403, -0.0087, -0.0153,  0.0077, -0.0877,  0.0498,\n",
       "           0.0670, -0.0625, -0.0283,  0.0377,  0.0591,  0.0666,  0.0476,  0.0932,\n",
       "           0.0210, -0.0095, -0.0436,  0.0343, -0.0998,  0.0095, -0.0247,  0.0735,\n",
       "          -0.0025, -0.0894, -0.0169, -0.0008, -0.0993, -0.0741,  0.0653, -0.0976,\n",
       "          -0.0381,  0.0085,  0.0672,  0.0765,  0.0908,  0.0210, -0.0499, -0.0140,\n",
       "          -0.0446, -0.0437, -0.0981,  0.0755,  0.0072,  0.0016,  0.0523, -0.0944,\n",
       "           0.0292,  0.0544, -0.0696,  0.0500,  0.0350, -0.0721,  0.0668, -0.0782,\n",
       "           0.0893,  0.0121, -0.0076,  0.0400],\n",
       "         [ 0.0925,  0.0711, -0.0318, -0.0063,  0.0164, -0.0389,  0.0369,  0.0718,\n",
       "          -0.0527, -0.0365, -0.0971, -0.0869, -0.0320,  0.0749,  0.0022, -0.0659,\n",
       "          -0.0772,  0.0472,  0.0909, -0.0775,  0.0474, -0.0484, -0.0016, -0.0507,\n",
       "           0.0764, -0.0798, -0.0347, -0.0005, -0.0935, -0.0422,  0.0635,  0.0761,\n",
       "           0.0736, -0.0077, -0.0023, -0.0447,  0.0845, -0.0111, -0.0315,  0.0618,\n",
       "          -0.0791, -0.0410,  0.0178,  0.0923, -0.0729,  0.0149, -0.0159,  0.0934,\n",
       "          -0.0628,  0.0202, -0.0003,  0.0450, -0.0516, -0.0925,  0.0531,  0.0394,\n",
       "          -0.0208,  0.0428, -0.0395, -0.0059, -0.0709, -0.0714, -0.0794,  0.0428,\n",
       "          -0.0343, -0.0620, -0.0007, -0.0133, -0.0394,  0.0176,  0.0007,  0.0244,\n",
       "           0.0252,  0.0770, -0.0492, -0.0048,  0.0401,  0.0027, -0.0163, -0.0836,\n",
       "           0.0096,  0.0750,  0.0610, -0.0860,  0.0249,  0.0921,  0.0647,  0.0656,\n",
       "           0.0177,  0.0301,  0.0097,  0.0688, -0.0336,  0.0388,  0.0186, -0.0931,\n",
       "          -0.0285, -0.0093, -0.0216, -0.0746],\n",
       "         [-0.0044, -0.0267,  0.0044, -0.0640,  0.0165, -0.0274, -0.0940, -0.0775,\n",
       "          -0.0706, -0.0287,  0.0885, -0.0423,  0.0216, -0.0370, -0.0835,  0.0614,\n",
       "           0.0777, -0.0729, -0.0822, -0.0954,  0.0112,  0.0361, -0.0519,  0.0184,\n",
       "           0.0987,  0.0334,  0.0692,  0.0239, -0.0432,  0.0601,  0.0584, -0.0179,\n",
       "           0.0131,  0.0014, -0.0689, -0.0276,  0.1000,  0.0450, -0.0084, -0.0825,\n",
       "          -0.0359,  0.0526,  0.0405,  0.0738,  0.0190,  0.0879, -0.0660,  0.0885,\n",
       "          -0.0351,  0.0266, -0.0758, -0.0973,  0.0484, -0.0945,  0.0502, -0.0355,\n",
       "           0.0359,  0.0701,  0.0678, -0.0867, -0.0337, -0.0953,  0.0323,  0.0187,\n",
       "           0.0592, -0.0692,  0.0943,  0.0050, -0.0895, -0.0226, -0.0344,  0.0699,\n",
       "          -0.0173,  0.0249,  0.0442,  0.0942,  0.0730,  0.0737,  0.0755, -0.0266,\n",
       "          -0.0280,  0.0582, -0.0424, -0.0191, -0.0433,  0.0842, -0.0885, -0.0176,\n",
       "           0.0487, -0.0031,  0.0749,  0.0648, -0.0102, -0.0718,  0.0961, -0.0363,\n",
       "          -0.0290,  0.0385, -0.0740, -0.0185]], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0594,  0.0463, -0.0698, -0.0232, -0.0584,  0.0115, -0.0082, -0.0139,\n",
       "         -0.0788,  0.0554], requires_grad=True)]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 27
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.918179Z",
     "start_time": "2025-03-05T06:13:13.915695Z"
    }
   },
   "source": [
    "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ],
   "outputs": [],
   "execution_count": 28
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.925168Z",
     "start_time": "2025-03-05T06:13:13.918179Z"
    }
   },
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()  #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "outputs": [],
   "execution_count": 29
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.929465Z",
     "start_time": "2025-03-05T06:13:13.925168Z"
    }
   },
   "cell_type": "code",
   "source": "10000 / 32",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "312.5"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 30
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.964178Z",
     "start_time": "2025-03-05T06:13:13.929465Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "\n",
    "@torch.no_grad()  # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []  # 记录损失\n",
    "    pred_list = []  # 记录预测\n",
    "    label_list = []  # 记录标签\n",
    "    for datas, labels in dataloader:  #10000/32=312\n",
    "        datas = datas.to(device)  # 转到GPU\n",
    "        labels = labels.to(device)  # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失,loss尺寸是一个数值\n",
    "        loss_list.append(loss.item())  # 记录损失,item是把tensor转换为数值\n",
    "\n",
    "        preds = logits.argmax(axis=-1)  # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())  #将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)  # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 31
  },
  {
   "cell_type": "code",
   "source": "1875 * 20",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:13:13.967144Z",
     "start_time": "2025-03-05T06:13:13.964178Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 32
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:16:39.282474Z",
     "start_time": "2025-03-05T06:13:13.967144Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    #tqdm是一个进度条库\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:  # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch):  # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader:  #执行次数是60000/32=1875\n",
    "                datas = datas.to(device)  #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device)  #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)  # logits:命名是业界规则\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)  # 计算梯度\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导==求梯度\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step()  #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1)  # 训练集预测\n",
    "                # 每32个batch打印一次训练集准确率\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())  # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item()  # 损失转到CPU，item()取值,一个数值\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })  # 记录训练集信息，每一步的损失，准确率，步数\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()  # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()  # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1  # 全局步数加1\n",
    "                pbar.update(1)  # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})  # 设置进度条显示信息\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 20  #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "a354d52ea0664edc9db7468bd9bf441d"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 33
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:16:39.288904Z",
     "start_time": "2025-03-05T06:16:39.283479Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.057753272354602814, 'acc': 1.0, 'step': 37495},\n",
       " {'loss': 0.18618112802505493, 'acc': 0.9375, 'step': 37496},\n",
       " {'loss': 0.2271309345960617, 'acc': 0.90625, 'step': 37497},\n",
       " {'loss': 0.18397144973278046, 'acc': 0.90625, 'step': 37498},\n",
       " {'loss': 0.6478425860404968, 'acc': 0.8125, 'step': 37499}]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 34
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-03-05T06:16:39.325290Z",
     "start_time": "2025-03-05T06:16:39.289909Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': np.float64(0.395735476261225), 'acc': 0.855, 'step': 33000},\n",
       " {'loss': np.float64(0.3665711869494603), 'acc': 0.8672, 'step': 34000},\n",
       " {'loss': np.float64(0.3539499227231303), 'acc': 0.8722, 'step': 35000},\n",
       " {'loss': np.float64(0.35307357269830214), 'acc': 0.8742, 'step': 36000},\n",
       " {'loss': np.float64(0.3497522829439693), 'acc': 0.8778, 'step': 37000}]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 35
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:16:39.548686Z",
     "start_time": "2025-03-05T06:16:39.326291Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1]  # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)  # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()  # 显示网格\n",
    "        axs[idx].legend()  # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000))  # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x / 1000)}k\", range(0, last_step, 5000)))  # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.06250\n",
      "1000     0.75000\n",
      "2000     0.75000\n",
      "3000     0.84375\n",
      "4000     0.75000\n",
      "5000     0.78125\n",
      "6000     0.81250\n",
      "7000     0.87500\n",
      "8000     0.81250\n",
      "9000     0.75000\n",
      "10000    0.90625\n",
      "11000    0.84375\n",
      "12000    0.87500\n",
      "13000    0.93750\n",
      "14000    0.78125\n",
      "15000    0.78125\n",
      "16000    0.90625\n",
      "17000    0.78125\n",
      "18000    0.81250\n",
      "19000    0.87500\n",
      "20000    0.87500\n",
      "21000    0.93750\n",
      "22000    0.93750\n",
      "23000    0.93750\n",
      "24000    0.78125\n",
      "25000    0.87500\n",
      "26000    0.87500\n",
      "27000    0.84375\n",
      "28000    0.84375\n",
      "29000    0.90625\n",
      "30000    0.75000\n",
      "31000    0.84375\n",
      "32000    0.93750\n",
      "33000    0.96875\n",
      "34000    0.87500\n",
      "35000    0.87500\n",
      "36000    0.90625\n",
      "37000    0.87500\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.0629\n",
      "1000     0.6993\n",
      "2000     0.7679\n",
      "3000     0.7989\n",
      "4000     0.8011\n",
      "5000     0.8192\n",
      "6000     0.8260\n",
      "7000     0.8301\n",
      "8000     0.8329\n",
      "9000     0.8374\n",
      "10000    0.8362\n",
      "11000    0.8413\n",
      "12000    0.8421\n",
      "13000    0.8423\n",
      "14000    0.8417\n",
      "15000    0.8453\n",
      "16000    0.8470\n",
      "17000    0.8537\n",
      "18000    0.8522\n",
      "19000    0.8544\n",
      "20000    0.8575\n",
      "21000    0.8458\n",
      "22000    0.8619\n",
      "23000    0.8628\n",
      "24000    0.8571\n",
      "25000    0.8629\n",
      "26000    0.8610\n",
      "27000    0.8636\n",
      "28000    0.8601\n",
      "29000    0.8686\n",
      "30000    0.8660\n",
      "31000    0.8644\n",
      "32000    0.8675\n",
      "33000    0.8550\n",
      "34000    0.8672\n",
      "35000    0.8722\n",
      "36000    0.8742\n",
      "37000    0.8778\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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sG7dOhYtWkRSUhJbtmyhtLSUcePG9Vn8QgghAqe8zsbP39kNwE1npbNwfDIA09Pj+epIGdtyKxg/ODaQIfaJ8KnoKA5wn/kqrhCif1u2bBl6vZ7x48czaNCgdufcPPXUU8THxzNv3jyWLl3K4sWLmT59ep/FOX36dN566y3ee+89Jk+ezP3338/DDz/MrbfeCkBcXBzvvfceF154IePGjeOFF17gzTffZMKECcTGxvLll1+yZMkSRo8ezX333ceTTz7JJZdc0mfxCyGECAxVVfnlu3sorbUxKima317adJFrdobWhGBrbkWgwutT/b6iY46IbLrjtILZErhghBABN3LkSDZs2NCicYI3eWguIyPDNwzM684772xx//ShbG21b66qqupUXOeff36r47/1rW+xcOFCYmNjWzV6OPvss1m/fn2bjzVu3DjWrFnTqecVQgjRv/x7cx7rDpZgMuj4y/XTsDRr2jMrU0t0tuVUoKqq3+a5Bqt+X9ExWaJ937vsjQGMRAghhBBCiN5zqKiW3686AMCvLx7LuNSWw9OmpsVh1CuU1NrIr2gIRIh9qt8nOhaTAZuqdUGyW+sCHI0QIlz96Ec/Ijo6us3bj370o0CHJ4QQIsRZHVoraZvTzfljBnHb/IxW+1iMeiYPjQNgS07/H77W/4euGfTUYcSMA3tj/89chRDB6eGHH+bee+9t82exsf1/QqgQQoje9YePD3KouJbEaBNPXDOl3WFpszIS2JFXybacCr49M62Po+xb/T7R0esUrJgYQAMOmyQ6QojASEpKIikpKdBhCCH8QFVV/vrZUSKMeu44d3igwwkaK3cV8Na2fNqYrtglESY9v1w8Niy6gvnLF4dLeXVjLgBPXDuFQTHmdvedk5nAC18cY1sYNCTo94kOgA3tl+201Qc4EiGEEEKEur0F1TyVdRiAb89KY0CE8QxH9H9Wh4vfffANtVanXx4vKcbM49dM8ctjhYP/tzkP0FpJXzCm44tq09PjURTILW+gpNZKUkz/bdQVFomOXdESHYdNmhEIIYQQomfe31Xg+z63rJ4paXGBCyZIrD9UQq3VSUqshd9dNr7bj5N9opIXv8ohp0wuTneW2636qjNXTx9yxv0HRBgZmxLLgcIatuVUcunk1N4OMWDCJNExgQouGbomhBBCiB5wutz8b3eh735uuSQ6ACt3nQLgimmDe3TinJYQwYtf5ZBbLudsnXW0tI6qBgcRRj0Thwzo1DGzM+I5UFjD1pzyfp3o9PuuawB2RSvJSaIjhBBCiJ7YcKycsjqb735umZxbVDc4+OxgCQBXTj1zRaEj6QO1hd5La23U2fwzDK6/2+rpnjY9PQ6jvnOn9t71dLbmVvZaXMEgLBIdh84EgNshQ9eEEEII0X0rPcPWLEbtFCq3XIZYrf6mELvLzdiUmFbrtnTVgAgjCVHaeVuuDF/rFO+wtVkZCZ0+ZrZn34NFNVQ3OnolrmAQFomOS6fN0XHLHB0hRA9lZGTwzDPPdGpfRVFYuXJlr8YjhOg79TYna74pAuDmuRkAMpeEpjlLV07rWTXHK2NgJAB5MnztjFRV9VV0Znch0UmKtZAxMBJVhZ15/beqExaJjkOnDV1zO+QfjBBCCCG6J2t/MY0OF+kDI7li6mAA8sK8onOysoGtORUoClw+ZbBfHjMjURu+JtWyMztZ2UhhtRWDTmHasPguHeutAG3tx22mwyLRcek9bfNk6JoQQgghumlltqdyMXUImZ6T8coGB9UN/Xfoz5l8uFtrQjAnM4HBcRF+ecxMzzwdqZadmXfY2sQhA4gw6bt0rG+eTo4kOiHNm+iokugI0TtUFez1gbl1YWW6f/zjH4wbNw63291i+xVXXMH3vvc9jh07xhVXXEFycjLR0dHMmjWLTz/91G9v0969e7nwwguJiIhg4MCB/OAHP6Curs738/Xr1zN79myioqKIi4vjnHPOIT8/H4Ddu3dzwQUXEBMTQ2xsLDNmzGD79u1+i00I0bHSWhtfHSkDtCFakSYDybHa0PicMK08qKrK+zu15O8qPw1bA0j3VnQk0Tkjb6IzJ7Pzw9a8vEPd9pyswupw+TWuYBEW7aXdnkRHcVoDHIkQ/ZSzEd0fxgXmuX9zCkxRndr12muv5a677uLzzz9n4cKFAFRUVLBmzRpWr15NXV0dS5Ys4fe//z1ms5nXXnuNpUuXcujQIYYNG9ajMOvr61m8eDFz585l27ZtlJSUcPvtt7Ns2TJeffVVnE4nV155JXfccQdvvvkmdrudzZs3oygKADfeeCPTpk3j+eefR6/Xk52djdEoixQK0Vc+2nMKl1tlSlqcr5qTPjCK4hobeeX1TA3DFtP7C2s4UlKHyaDj4on+a1HsrehIi+kz81ZjutKIwCt9YCRJMWZKam1kn6jirOED/R1ewIVFoqMaPImOVHSECGvx8fEsWLCAN99805fovPvuuyQmJnLBBReg0+mYMqVpJe5HHnmE999/nw8//JBly5b16LnfeOMNrFYrr732GlFR2of43/72N5YuXcof//hHjEYj1dXVXHbZZYwYMQKAMWPGUFNTA0B+fj6/+MUvGDt2LACjRo3qUTxCiK7xdlu7amrTPJTMgVFszakI2yFW3vdkwbgkBkT478JLeqLWjKCszkat1UGMRS7qtKWszsaxUu1vb2ZG1+bngNYwZ1ZmAqv2FLItp0ISnVDl9iQ6uKSiI0SvMETg/vVJdLoAjIY1RnZp92uvvZa7776b559/HrPZzOuvv853vvMddDoddXV1PPjgg6xatYrCwkKcTieNjY2+4WM9ceDAAaZMmeJLcgDmz5+P2+3m0KFDnHvuudx6660sXryYhQsXsmDBAq655hrf/suXL+f222/n3//+NwsWLODaa6/1JURCiCb/2X6SXUUKS/z4mMdL69h9shq9TuGyZhPuM/pgiNW/NuYSG2HgqmlDe+05usPlVvkgW5uf09O1c04XazEyMMpEeb2dvPKGTi+CGYxOVDTw4lfHWXbBSJJiLX597O2eYWtjkmOIizR16zFmZ2iJjj8bEvxrYy7VjQ6WXTASnU7x2+N2R1jM0cGoTY7Tu2xn2FEI0S2Kog0fC8RN6dp/ohdffDGqqrJq1SpOnDjBV199xY033gjAvffey/vvv8+jjz7KV199RXZ2NpMmTcJut/fGu9bKK6+8wqZNm5g3bx5vv/02Y8eOZdu2bQA8+OCD7Nu3j0svvZTPPvuM8ePH8/777/dJXEKEihqrg/s+3M+7OXoOFdX67XFXek7ozx2VSGK02bc901N5yOmlIVb55Q088OE+7n1nDw324Fo8c/PxckpqbQyIMHL+mCS/P35/6bz20P/289qmPF7ekOv3x96ao7WFnpXZ9WqOl3fI2868Spwu9xn2PrNVewp54MN9PJV1mFc25vb48XoqPBIdT0VH55Sha0KEO4vFwlVXXcXrr7/Om2++yZgxY5g+fToAGzZs4NZbb+Wqq65i0qRJpKSkkJub65fnHTduHLt376a+vulDe8OGDeh0OsaMGePbNm3aNFasWMHGjRuZOHEi7777ru9no0eP5p577mHt2rVcffXVvPLKK36J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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 36
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-05T06:16:41.114229Z",
     "start_time": "2025-03-05T06:16:39.549694Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval()  # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3504\n",
      "accuracy: 0.8759\n"
     ]
    }
   ],
   "execution_count": 37
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
